package xyz.hubery.model;

import lombok.Data;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.util.CollectionUtils;
import xyz.hubery.domain.DepthItemVo;
import xyz.hubery.domain.Order;
import xyz.hubery.enums.OrderDirection;

import java.math.BigDecimal;
import java.util.LinkedList;
import java.util.Objects;

/**
 * 交易的盘口数据,以后前端可以查询该数据
 */
@Data
public class TradePlate {

    private static final Logger log = LoggerFactory.getLogger(TradePlate.class);
    /**
     * 盘口数据的详情
     */
    private LinkedList<DepthItemVo> items = new LinkedList<DepthItemVo>();

    /**
     * 最大支持的深度
     */
    private int maxDepth = 100;

    /**
     * 订单的方向
     */
    private OrderDirection direction;

    /**
     * 交易对
     */
    private String symbol;

    public TradePlate(String symbol, OrderDirection direction) {
        this.symbol = symbol;
        this.direction = direction;
    }

    /**
     * 添加一个订单
     *
     * @param order
     */
    public void add(Order order) {
        if (direction.getCode() != order.getOrderDirection()) {
            return;
        }
        int i = 0;
        for (i = 0; i < items.size(); i++) {
            DepthItemVo item = items.get(i);
            // 如果是买入盘，价格从大到小（先遇到高价）
            // 如果是卖出盘，价格从小到大（先遇到低价）
            if ((direction.getCode() == OrderDirection.BUY.getCode() && item.getPrice().compareTo(order.getPrice()) > 0)
                    ||
                (direction.getCode() == OrderDirection.SELL.getCode()) && item.getPrice().compareTo(order.getPrice()) < 0) {
                continue;
            } else if (item.getPrice().compareTo(order.getPrice()) == 0) { // 价格相同
                item.setVolume(item.getVolume().add(order.getVolume().subtract(order.getTradedVolume())));
                return;
            } else {
                break; // 可以插入了
            }
        }
        if (i < maxDepth) {
            DepthItemVo plateItem = new DepthItemVo();
            plateItem.setPrice(order.getPrice());
            plateItem.setVolume(order.getVolume().subtract(order.getTradedVolume()));
            items.add(i, plateItem);
        }
    }


    /**
     * 移除订单
     *
     * @param order
     */
    public void remove(Order order) {
        remove(order, order.getTradedVolume());
    }

    /**
     * 从盘口里面移除数据
     *
     * @param order  订单
     * @param volume 成交量
     */
    public void remove(Order order, BigDecimal volume) {
        if (CollectionUtils.isEmpty(items) || order.getOrderDirection() != direction.getCode()) {
            return;
        }
        // 遍历盘口数据
        for (DepthItemVo item : items) {
            if (item.getPrice().compareTo(order.getPrice())==0) {
                item.setVolume(item.getVolume().subtract(volume)); // 减少处理完的数量
                if ( item.getVolume().compareTo(BigDecimal.ZERO) <= 0) { // 数量小于0，说明没有该价格的订单了
                    items.remove(item); // 若数量为 0 后,我们直接可以摘掉它
                    return;
                }
            }
        }
    }


}
